package br.com.viaembratel.model;


import br.com.viaembratel.model.vo.CidadeVO;
import br.com.viaembratel.modulointegrador.vialivre.consultaconsumidorv1.ConsultaConsumidorPortType;
import br.com.viaembratel.modulointegrador.vialivre.consultaconsumidorv1.ConsultaConsumidorService;
import br.com.viaembratel.modulointegrador.vialivre.consultaconsumidorv1.ConsultarRequest;
import br.com.viaembratel.modulointegrador.vialivre.consultaconsumidorv1.ConsultarResponse;
import br.com.viaembratel.modulointegrador.vialivre.consultaconsumidorv1.ObterRequest;
import br.com.viaembratel.modulointegrador.vialivre.consultaconsumidorv1.ObterResponse;
import br.com.viaembratel.modulointegrador.vialivre.enderecov1.EnderecoPortType;
import br.com.viaembratel.modulointegrador.vialivre.enderecov1.EnderecoService;
import br.com.viaembratel.modulointegrador.vialivre.enderecov1.ListarCidadesRequest;
import br.com.viaembratel.modulointegrador.vialivre.enderecov1.ListarCidadesResponse;
import br.com.viaembratel.vialivre.modelo.ged.endereco.v1_0_0.types.CidadesType;
import br.com.viaembratel.vialivre.modelo.ged.endereco.v1_0_0.types.UFType;
import br.com.viaembratel.vialivre.modelo.prepago.consumidor.v1_0_0.types.ConsumidorType;
import br.com.viaembratel.vialivre.modelo.prepago.consumidor.v1_0_0.types.ConsumidoresType;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

import javax.xml.ws.WebServiceRef;

import weblogic.utils.StringUtils;


@Stateless(name = "ConsultaConsumidorEJB",
           mappedName = "ViaLivreWeb-Model-ConsultaConsumidorEJB")
public class ConsultaConsumidorEJBBean implements ConsultaConsumidorEJBLocal {

    @WebServiceRef
    ConsultaConsumidorService consultaConsumidorService;

    @WebServiceRef
    EnderecoService enderecoService;

    public ConsultaConsumidorEJBBean() {
    }

    public ConsumidoresType consultaConsumidores(String idConsumidor,
                                                 String documento,
                                                 String identificadorCidade,
                                                 String nome,
                                                 String identificadorStatusAtual) {

        ConsumidoresType consumidores = new ConsumidoresType();

        if (!StringUtils.isEmptyString(idConsumidor)) {
            consumidores.getConsumidor().add(obterConsumidor(idConsumidor));
        } else {
            consumidores =
                    consultaConsumidor(documento, identificadorCidade, nome,
                                       identificadorStatusAtual);
        }

        return consumidores;
    }

    private ConsumidoresType consultaConsumidor(String documento,
                                                String identificadorCidade,
                                                String nome,
                                                String identificadorStatusAtual) {
        ConsultaConsumidorPortType consultaConsumidorPortType =
            consultaConsumidorService.getConsultaConsumidorSOAP11Port();

        ConsultarRequest request = new ConsultarRequest();

        if (!StringUtils.isEmptyString(documento)) {
            request.setDocumento(!StringUtils.isEmptyString(documento) ?
                                 documento : null);
        } else {

            request.setDadosCadastrais(new ConsultarRequest.DadosCadastrais());
            request.getDadosCadastrais().setNome(!StringUtils.isEmptyString(nome) ?
                                                 nome : null);
            request.getDadosCadastrais().setIdentificadorCidade(!StringUtils.isEmptyString(identificadorCidade) &&
                                                                !identificadorCidade.equals("0") ?
                                                                Integer.valueOf(identificadorCidade) :
                                                                null);
            request.getDadosCadastrais().setIdentificadorStatusAtual(!StringUtils.isEmptyString(identificadorStatusAtual) &&
                                                                     !identificadorStatusAtual.equals("0") ?
                                                                     Integer.valueOf(identificadorStatusAtual) :
                                                                     null);
        }

        ConsultarResponse response =
            consultaConsumidorPortType.consultar(request);

        return response.getConsumidores();
    }

    public CidadesType obterCidades(String uf) {

        EnderecoPortType enderecoPortType =
            enderecoService.getEnderecoSOAP11Port();
        ListarCidadesRequest request = new ListarCidadesRequest();

        request.setUf(!StringUtils.isEmptyString(uf) ? UFType.valueOf(uf) :
                      null);

        ListarCidadesResponse response =
            enderecoPortType.listarCidades(request);

        return response.getCidades();
    }

    public ConsumidorType obterConsumidor(String idConsumidor) {

        ConsultaConsumidorPortType consultaConsumidorPortType =
            consultaConsumidorService.getConsultaConsumidorSOAP11Port();

        ObterRequest request = new ObterRequest();
        request.setIdentificadorConsumidor(new Long(idConsumidor));

        ObterResponse response = consultaConsumidorPortType.obter(request);

        return response.getConsumidor();
    }
}
